package com.itheima.d14_extends_constructor;

/**
 * 补充知识：this(…)调用兄弟构造器
 *  任意类的构造器中，是可以通过this(…) 去调用该类的其他构造器的。
 *
 *  this(...)和super(…)使用时的注意事项：
 * this(…) 、super(…) 都只能放在构造器的第一行，因此，有了this(…)就不能写super(…)了，反之亦然。
 *
 * 子类构造器有啥特点？
 * 子类中的全部构造器，都必须先调用父类的构造器，再执行自己。
 * 2、super(…)调用父类有参数构造器的常见应用场景是什么？
 *  为子类对象中包含父类这部分的成员变量进行赋值。
 * 3、this(…)的作用是什么？
 *  在构造器中调用本类的其他构造器。
 * 3、this(…)和super(…)的使用需要注意什么？
 *  都必须放在构造器的第一行。
 *
 *  为什么子类构造器一定要先调用父类的构造器：
 *  引入继承后，子类对象是由子类和父类这多张设计图共同创建出来的，当创建子类对象，
 *  调用子类构造器为子类的成员变量初始化时，子类构造器肯定需要先调用父类构造器，把父类中的成员变量先进行初始化。
 * 注意：super(…)必须放在构造器的第一行，否则报错
 *
 */

/**
 * 访问本类成员：
 * 	this.成员变量	//访问本类成员变量
 * 	this.成员方法	//调用本类成员方法
 * 	this()		   //调用本类空参数构造器
 *     this(参数)	  //调用本类有参数构造器
 *
 * 访问父类成员：
 * 	super.成员变量	//访问父类成员变量
 * 	super.成员方法	//调用父类成员方法
 * 	super()		   //调用父类空参数构造器
 *     super(参数)	  //调用父类有参数构造器
 *
 * 注意：this和super访问构造方法，只能用到构造方法的第一句，否则会报错。
 */

public class Test3 {
    public static void main(String[] args) {
        // 目标：掌握在类的构造器中，通过this(...)调用兄弟构造器的作用。
        Student s1 = new Student("李四", 26, "家里蹲大学");
        System.out.println(s1.getName());
        System.out.println(s1.getAge());
        System.out.println(s1.getSchoolName());

        System.out.println("============");


        //假设只需要初始化两个参数，第三个参数是固定值，那就用不到三个参数的有参构造器
        // 需求：如果学生没有填写学校，那么学校默认就是黑马程序员
        Student s2 = new Student("张三", 28);
        System.out.println(s2.getName());
        System.out.println(s2.getAge());
        System.out.println(s2.getSchoolName());
    }
}

class Student{
    private String name;
    private int age;
    private String schoolName;

    public Student() {
    }

    //提供两个参数的有参构造器
    public Student(String name, int age){
        //初始写法
     /*   this.name = name;
        this.age = age;
        this.schoolName = "黑马程序员";*/

        //简化成下面的写法，用this调用
        // 补充知识：this(…)调用兄弟构造器: 任意类的构造器中，是可以通过this(…) 去调用该类的其他构造器的。
        this(name, age, "黑马程序员");

        /*如果这样写了，那么上面调用this是要借用兄弟构造器的，但是借用的兄弟构造器也是继承自object类的
        也是会有super（）默认但隐藏，也会调用父类object的构造器。
        所以就相当于调用完兄弟构造器的super之后，又通过super调用一次父类构造器，那就是有问题的
        因此，this(…)和super(…)不能同时出现在构造器中
        super();  //报错
        */

        System.out.println("补充知识：this(…)调用兄弟构造器:在任意类的构造器中，是可以通过this(…) 去调用该类的其他构造器的。");
        System.out.println("调用了只有两个参数name和age的构造器，this为： "+ this);
    }

    public Student(String name, int age, String schoolName) {
        super();
        this.name = name;
        this.age = age;
        this.schoolName = schoolName;
        System.out.println("调用了三个参数name和age和schoolName的构造器，this为： "+ this);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }
}